zero trust architecture blueprint/archive/zero-trust-architecture-offline/run.ps1 (144 lines of code) (raw):

$jConfig = Get-Content "./run.config.json" | ConvertFrom-Json $tempPath = $jConfig.args.tempPath $policyTemplate = $jConfig.args.policyTemplate $artifactsPath = $jConfig.args.artifactsPath $policyAssignmentPrefix = $jConfig.args.policyAssignmentPrefix $onlyGenerateTemplates = $jConfig.args.onlyGenerateTemplates $deploymentUserObjectIdParameterName = "deployment-user-object-id" $resourceLocation = $jConfig.parameters.location.value $jDefaultParams = Get-Content $jConfig.args.defaultParams | ConvertFrom-Json function Add-DefaultParamsToTemplate { param ( $jTemplate, $jParameterProperties ) foreach ($paramNames in $jParameterProperties.psobject.properties.value) { $defaultParams = Get-DefaultParameterValues -paramName $null -paramNames $paramNames foreach ($defaultParam in $defaultParams.keys) { if ($null -ne $defaultParams[$defaultParam] -and $jTemplate.parameters.psobject.properties.name -notcontains $defaultParam) { $jTemplate.parameters | add-member -Name $defaultParam -value $defaultParams[$defaultParam] -MemberType NoteProperty } } } } function Get-DefaultParameterValues { param ( $paramName, $paramNames ) $defaultParams = @{ } $pattern = 'parameters\(''(?<name>[^\s]*)''\)' foreach ($g in Select-String -InputObject $paramNames -Pattern $pattern -AllMatches | % { $_.matches.groups }) { if ($g.Name -eq "name" -and $jDefaultParams.properties.parameters.psobject.properties.name -contains $g.value) { if ($null -eq $paramName) { $defaultParams[$g.value] = $jDefaultParams.properties.parameters.$($g.value) } else { $defaultParams[$paramName] = $jDefaultParams.properties.parameters.$($g.value) } } } return $defaultParams } function Get-TemplateParameters { param ( $jParameters ) $templateParameters = @{ } foreach ($paramName in $jParameters.psobject.properties.name) { foreach ($name in $jConfig.parameters.psobject.properties.name) { if ($name -eq $paramName -and $null -ne $jConfig.parameters.$($name)) { $templateParameters[$paramName] = $jConfig.parameters.$($name) } } } if ($null -ne $templateParameters.$deploymentUserObjectIdParameterName) { if ($null -eq $templateParameters.$deploymentUserObjectIdParameterName.value -or "" -eq $templateParameters.$deploymentUserObjectIdParameterName.value) { if ($onlyGenerateTemplates -eq $false) { $userObjectId = (Get-AzADUser -UserPrincipalName (Get-AzContext).Account.Id).Id $templateParameters[$deploymentUserObjectIdParameterName] = @{ "value" = $userObjectId } } } } return $templateParameters } function New-PolicyAssignment { param ( $artifact ) $jArtifact = Get-Content $artifact | ConvertFrom-Json if ($jArtifact.kind -ne "policyAssignment") { Write-Host "Artifact '$($artifact)' is not a valid policyAssignment. Skipping..." return } $jPolicyTemplate = Get-Content $policyTemplate | ConvertFrom-Json $jPolicyTemplate.resources.properties | add-member -Name "parameters" -Value $jArtifact.properties.parameters -MemberType NoteProperty Add-DefaultParamsToTemplate -jTemplate $jPolicyTemplate -jParameterProperties $jPolicyTemplate.resources.properties.parameters Add-DefaultParamsToTemplate -jTemplate $jPolicyTemplate -jParameterProperties $jPolicyTemplate.parameters $templateParameters = Get-TemplateParameters -jParameters $jPolicyTemplate.parameters $templateParameters.policyAssignmentName = @{ } $policyAssignmentName = "$($policyAssignmentPrefix)$($jArtifact.properties.displayName)" if ($policyAssignmentName.Length -lt 65) { $templateParameters.policyAssignmentName.value = $policyAssignmentName.Trim() } else { $templateParameters.policyAssignmentName.value = $policyAssignmentName.Substring(0, 64).Trim() } $templateParameters.policyDefinitionID = @{ } $templateParameters.policyDefinitionID.value = $jArtifact.properties.policyDefinitionId $templateParameters.location.value = $resourceLocation $policyTemplateFile = "$($tempPath)/policy.$($jArtifact.name).json" $jPolicyTemplate | ConvertTo-Json -Depth 100 | Set-Content $policyTemplateFile $policyTemplateParameterFile = "$($tempPath)/policy.$($jArtifact.name).parameters.json" $templateParameters | ConvertTo-Json -Depth 100 | Set-Content $policyTemplateParameterFile if ($onlyGenerateTemplates -eq $false) { New-AzDeployment -Location $resourceLocation -TemplateFile $policyTemplateFile -TemplateParameterFile $policyTemplateParameterFile } } function New-ResourceDeployment { param ( $artifact ) $jArtifact = Get-Content $artifact | ConvertFrom-Json if ($null -eq $jArtifact.properties.template) { Write-Host "Artifact '$($artifact)' does not contain a valid resource template. Skipping..." return } $jResourceTemplate = $jArtifact.properties.template foreach ($param in $jArtifact.properties.parameters.psobject.properties) { $defaultParamValues = Get-DefaultParameterValues -paramName $param.name -paramNames $param.value -jDefaultParams $jDefaultParams $jResourceTemplate.parameters.$($param.name) = $defaultParamValues[$param.name] } $resourceTemplateFile = "$($tempPath)/resource.$($jArtifact.name).json" $jResourceTemplate | ConvertTo-Json -Depth 100 | Set-Content $resourceTemplateFile -Force $resourceTemplateParameterFile = "$($tempPath)/resource.$($jArtifact.name).parameters.json" Get-TemplateParameters -jParameters $jResourceTemplate.parameters -jConfig $jConfig | ConvertTo-Json -Depth 100 | Set-Content $resourceTemplateParameterFile -Force if ($onlyGenerateTemplates -eq $false) { if ($jResourceTemplate.'$schema'.EndsWith("subscriptionDeploymentTemplate.json#")) { New-AzDeployment -Location $resourceLocation -TemplateFile $resourceTemplateFile -TemplateParameterFile $resourceTemplateParameterFile } else { $resourceGroupName = "$($jConfig.parameters.resourcePrefix.value)-sharedsvcs-rg" New-AzResourceGroup -Name $resourceGroupName -Location $resourceLocation -Force New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile $resourceTemplateFile -TemplateParameterFile $resourceTemplateParameterFile } } } # MAIN $ErrorActionPreference = "Stop" Set-Item Env:\SuppressAzurePowerShellBreakingChangeWarnings "true" New-Item -ItemType Directory -Force -Path $tempPath foreach ($policy in $jConfig.policies) { if ($policy.enabled -eq $true) { Write-Host "===== Start: Assigning policy '$($policyAssignmentPrefix)$($policy.name)'... =====" New-PolicyAssignment -artifact "$($artifactsPath)/$($policy.artifact)" Write-Host "===== End: Assigning policy '$($policyAssignmentPrefix)$($policy.name)'... =====" } } foreach ($resource in $jConfig.resources) { if ($resource.enabled -eq $true) { Write-Host "===== Start: Deploying resource '$($resource.name)' =====" New-ResourceDeployment -artifact "$($artifactsPath)/$($resource.artifact)" Write-Host "===== End: Deploying resource '$($resource.name)' =====" } }